//fait par Carl-Johan JORGENSEN et Marie DUVAUDIER

tree grammar vslTree;

options {
    	tokenVocab=vsl;
    	ASTLabelType=CommonTree;
	output=AST;
}

//@header {}

//@members {}


//TODO

/*------------------------------------------------------------------
 * TREE RULES
 *------------------------------------------------------------------*/

program		: 	^(PROG unite+)
		;

unite		:	^(FUNC_KW type IDENT param_list ^(CORPS statement))
		|	^(PROTO_KW type param_list)
		;

type		:	INT_KW^
		|	VOID_KW^
		;

param_list	:	^(PARAM param*) 
		;

param		:	IDENT
	        |	^(ARRAY IDENT) 
		;

statement	:	^(ASSIGN_KW IDENT expression)
		|	^(ASSIGN_KW tab_elem expression)
		|	^(RETURN_KW expression)
		|	^(PRINT_KW print_list)
		|	^(READ_KW read_list)
		|	^(IF_KW expression statement (statement)?)
		|	^(WHILE_KW expression statement)
		|	^(FCALL_S IDENT argument_list?)
		|	block 
		;

block		:	^(BLOCK declaration suit_inst)
		|	^(BLOCK suit_inst) 
		;


tab_elem	: 	^(ARELEM IDENT expression)
		;

suit_inst	:	^(INST statement+) 
		;


expression	:	^((PLUS|MOINS|MUL|DIV) expression expression) | primaire
		;

//fact		:	primaire (^(MUL|DIV) primaire)*
//		;

primaire	:	INTEGER
		|	IDENT
      		|	tab_elem
		|	^(FCALL IDENT argument_list?)
//		|	expression
		;

argument_list	:	expression (expression)*
		;

print_list	:	print_item (print_item)*
		;

print_item	:	TEXT
		|	expression
		;

read_list	:	read_item(read_item)*
		;

read_item	:	IDENT
		|	tab_elem
		;

declaration	:	^(DEC dec_item+) 
		;

dec_item	:	IDENT
          	|	^(ARDEC IDENT INTEGER)
		;


